home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / demo / frame.cpp.z / frame.cpp
Encoding:
C/C++ Source or Header  |  2002-04-08  |  6.7 KB  |  233 lines

  1. /****************************************************************************
  2. ** $Id:  qt/frame.cpp   3.0.3   edited Dec 4 21:36 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. #include "frame.h"
  12.  
  13. #include <qapplication.h>
  14. #include <qpopupmenu.h>
  15. #include <qmenubar.h>
  16. #include <qaccel.h>
  17. #include <qsplitter.h>
  18. #include <qlistbox.h>
  19. #include <qpainter.h>
  20. #include <qwidgetstack.h>
  21. #include <qstylefactory.h>
  22. #include <qaction.h>
  23. #include <qsignalmapper.h>
  24. #include <qdict.h>
  25. #include <qtextcodec.h>
  26. #include <stdlib.h>
  27.  
  28. static QTranslator *translator = 0;
  29. static QTranslator *qt_translator = 0;
  30.  
  31. class CategoryItem : public QListBoxItem {
  32. public:
  33.     CategoryItem( QListBox *parent, QWidget *widget,
  34.           const QPixmap &p, const QString &name, int id );
  35.     CategoryItem(QListBox *parent, QWidget *widget,
  36.           const QPixmap &p1, const QPixmap &p2, const QString &name, int id );
  37.     virtual QString key( int, bool ) const;
  38.     virtual int height( const QListBox * ) const;
  39.     virtual int width( const QListBox * )  const;
  40.  
  41.     int id() const { return _id; }
  42.     void setWidget(QWidget *w) { Q_ASSERT(!_widget); _widget = w; }
  43.     QWidget *widget() const { return _widget; }
  44. protected:
  45.     virtual void paint( QPainter * );
  46. private:
  47.     int _id;
  48.     QWidget *_widget;
  49.     QPixmap pm_Unsel;
  50.     QPixmap pm_Sel;
  51. };
  52.  
  53. CategoryItem::CategoryItem( QListBox *parent, QWidget *widget,
  54.                 const QPixmap &p, const QString &name, int id )
  55.     : QListBoxItem( parent ),
  56.       _id( id ),
  57.       _widget( widget ),
  58.       pm_Unsel( p ),
  59.       pm_Sel( p )
  60. {
  61.     setText( name );
  62. }
  63.  
  64. CategoryItem::CategoryItem( QListBox * parent, QWidget *widget, const QPixmap &p1, const QPixmap &p2,
  65.                 const QString &name, int id )
  66.     : QListBoxItem( parent ),
  67.       _id( id),
  68.       _widget( widget ),
  69.       pm_Unsel( p1 ),
  70.       pm_Sel( p2 )
  71. {
  72.     setText( name );
  73. }
  74.  
  75.  
  76.  
  77. QString CategoryItem::key( int, bool ) const
  78. {
  79.     QString tmp;
  80.     return tmp.sprintf( "%03d", _id );
  81. }
  82.  
  83. int CategoryItem::height( const QListBox * ) const
  84. {
  85.     return 100;
  86. }
  87.  
  88. int CategoryItem::width( const QListBox * )  const
  89. {
  90.     return 150;
  91. }
  92.  
  93. void CategoryItem::paint( QPainter *p )
  94. {
  95.     int w = width( listBox() );
  96.     int tx = (w-p->fontMetrics().boundingRect(text()).width())/2;
  97.     p->drawText( tx, 80, text() );
  98.     if ( isSelected() )
  99.     p->drawPixmap( (w-pm_Sel.width())/2, 10, pm_Sel );
  100.     else
  101.         p->drawPixmap( (w-pm_Unsel.width())/2, 10, pm_Unsel );
  102. }
  103.  
  104. Frame::Frame( QWidget *parent, const char *name )
  105.     : QMainWindow( parent, name )
  106. {
  107.     title = tr( "Qt Demo Collection" );
  108.     setCaption( title );
  109.  
  110.     // set up the menu bar
  111.     QMenuBar *mainMenu = menuBar();
  112.     QPopupMenu *fileMenu = new QPopupMenu( this, "file" );
  113.     fileMenu->insertItem( tr( "&Exit" ), this, SLOT( close() ),
  114.               QAccel::stringToKey( tr( "Ctrl+Q" ) ) );
  115.  
  116.     QPopupMenu *styleMenu = new QPopupMenu( this, "style" );
  117.     styleMenu->setCheckable( TRUE );
  118.     QActionGroup *ag = new QActionGroup( this, 0 );
  119.     ag->setExclusive( TRUE );
  120.     QSignalMapper *styleMapper = new QSignalMapper( this );
  121.     connect( styleMapper, SIGNAL( mapped( const QString& ) ), this, SLOT( setStyle( const QString& ) ) );
  122.  
  123.     QStringList list = QStyleFactory::keys();
  124.     list.sort();
  125.     QDict<int> stylesDict( 17, FALSE );
  126.     for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
  127.     QString style = *it;
  128.     QString styleAccel = style;
  129.     if ( stylesDict[styleAccel.left(1)] ) {
  130.         for ( uint i = 0; i < styleAccel.length(); i++ ) {
  131.         if ( !stylesDict[styleAccel.mid( i, 1 )] ) {
  132.             stylesDict.insert(styleAccel.mid( i, 1 ), (const int *)1);
  133.             styleAccel = styleAccel.insert( i, '&' );
  134.             break;
  135.         }
  136.         }
  137.     } else {
  138.         stylesDict.insert(styleAccel.left(1), (const int *)1);
  139.         styleAccel = "&"+styleAccel;
  140.     }
  141.     QAction *a = new QAction( style, QIconSet(), styleAccel, 0, ag, 0, ag->isExclusive() );
  142.     connect( a, SIGNAL( activated() ), styleMapper, SLOT(map()) );
  143.     styleMapper->setMapping( a, a->text() );
  144.     }
  145.     ag->addTo( styleMenu );
  146.  
  147.     mainMenu->insertItem( tr( "&File" ), fileMenu );
  148.     mainMenu->insertItem( tr( "St&yle" ), styleMenu );
  149.     mainMenu->setItemChecked( idEnglish, TRUE );
  150.  
  151.     // category chooser
  152.     QSplitter *splitter = new QSplitter( this );
  153.     categories = new QListBox( splitter );
  154.     QFont f = categories->font();
  155.     f.setWeight( QFont::Bold );
  156.     categories->setFont( f );
  157.  
  158.     connect( categories, SIGNAL( clicked( QListBoxItem *) ),
  159.                             SLOT( clickedCategory( QListBoxItem *) ) );
  160.  
  161.     // stack for the demo widgets
  162.     stack = new QWidgetStack( splitter );
  163.  
  164.     setCentralWidget( splitter );
  165. }
  166.  
  167. void Frame::addCategory( QWidget *w, const QPixmap &p, const QString &n )
  168. {
  169.     int i = categories->count();
  170.     stack->addWidget( w, i );
  171.     CategoryItem *item = new CategoryItem( categories, w, p, n, i );
  172.     if ( !stack->visibleWidget() ) {
  173.     categories->setCurrentItem( item );
  174.     clickedCategory( item );
  175.     }
  176.     if ( i < 3 && categories->height() < 3 * item->height( categories ) )
  177.     categories->setMinimumHeight( 3 * item->height( categories ) );
  178. }
  179.  
  180. void Frame::addCategory( QWidget *w, const QPixmap &p1, const QPixmap &p2, const QString &n )
  181. {
  182.     int i = categories->count();
  183.     if(w)
  184.     stack->addWidget( w, i );
  185.     CategoryItem *item = new CategoryItem( categories, w, p1, p2, n, i );
  186.     if ( !stack->visibleWidget() ) {
  187.     categories->setCurrentItem( item );
  188.     clickedCategory( item );
  189.     }
  190.     if ( i < 3 && categories->height() < 3 * item->height( categories ) )
  191.     categories->setMinimumHeight( 3 * item->height( categories ) );
  192. }
  193.  
  194. void Frame::setStyle( const QString& style )
  195. {
  196.     QStyle *s = QStyleFactory::create( style );
  197.     if ( s )
  198.     QApplication::setStyle( s );
  199. }
  200.  
  201. void Frame::clickedCategory( QListBoxItem *item )
  202. {
  203.     if ( item ) {
  204.     CategoryItem *c = (CategoryItem*)item;
  205.     topLevelWidget()->setCaption( title + " - " + item->text() );
  206.     if ( !c->widget() ) {
  207.         QWidget *w = createCategory(item->text());
  208.         if ( w ) {
  209.         c->setWidget(w);
  210.         stack->addWidget(w, c->id());
  211.         } else {
  212.         qDebug("Lazy creation of %s failed", item->text().latin1());
  213.         }
  214.     }
  215.     stack->raiseWidget( c->widget() );
  216.     }
  217. }
  218.  
  219. void Frame::updateTranslators()
  220. {
  221.     if ( !qt_translator ) {
  222.     qt_translator = new QTranslator( qApp );
  223.     translator = new QTranslator( qApp );
  224.     qApp->installTranslator( qt_translator );
  225.     qApp->installTranslator( translator );
  226.     }
  227.  
  228.     QString QTDIR = getenv( "QTDIR" );
  229.  
  230.     qt_translator->load( QString( "qt_%1" ).arg( QTextCodec::locale() ), QTDIR + "/translations" );
  231.     translator->load( QString( "translations/demo_%1" ).arg( QTextCodec::locale() ) );
  232. }
  233.